package com.jeesite.modules.common.utils;

import com.jeesite.common.utils.OrgUtil;
import com.jeesite.common.utils.SpringUtils;
import com.jeesite.modules.billnopattern.service.BillNoPatternService;
import com.jeesite.modules.codingrule.enums.BarcodeTypeEnum;
import com.jeesite.modules.codingrule.service.CodingRuleHeaderService;

import java.util.List;

/**
 * 单号工具类
 *
 * @author Kephon
 */
public class BillNoUtil {

	private static final BillNoPatternService BILL_NO_PATTERN_SERVICE = SpringUtils.getBean(BillNoPatternService.class);

	private static final CodingRuleHeaderService CODING_RULE_HEADER_SERVICE = SpringUtils.getBean(CodingRuleHeaderService.class);


	// ----------------------------------------------------------------
	// 生成编码
	// ----------------------------------------------------------------

	/**
	 * 判断表单编码规则，是否自动生成
	 */
	public static boolean isAutoGenned(long orgId, String formCode) {
		return CODING_RULE_HEADER_SERVICE.isAutoGenned(orgId, formCode);
	}

	public static boolean isAutoGenned(String formCode) {
		return isAutoGenned(OrgUtil.getOrgId(), formCode);
	}

	/**
	 * 生成编码
	 *
	 * @param orgId    组织ID
	 * @param orgCode  组织编码
	 * @param formCode 表单编码
	 */
	public static String genCode(long orgId, String orgCode, String formCode) {
		return BILL_NO_PATTERN_SERVICE.generateBillNo(orgId, orgCode, formCode, null);
	}

	/**
	 * 生成编码
	 *
	 * @param formCode 表单编码
	 */
	public static String genCode(String formCode) {
		return genCode(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), formCode);
	}

	/**
	 * 生成多个编码
	 *
	 * @param orgId    组织ID
	 * @param orgCode  组织编码
	 * @param formCode 表单编码
	 * @param genSize  生成数量
	 */
	public static List<String> genCodes(long orgId, String orgCode, String formCode, int genSize) {
		return BILL_NO_PATTERN_SERVICE.generateBillNos(orgId, orgCode, formCode, null, genSize);
	}

	/**
	 * 生成多个编码
	 *
	 * @param formCode 表单编码
	 * @param genSize  生成数量
	 */
	public static List<String> genCodes(String formCode, int genSize) {
		return genCodes(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), formCode, genSize);
	}

	/**
	 * 生成编码
	 *
	 * @param orgId    组织ID
	 * @param orgCode  组织编码
	 * @param formCode 表单编码
	 * @param paramStr 动态参数
	 */
	public static String genCode(long orgId, String orgCode, String formCode, String paramStr) {
		return BILL_NO_PATTERN_SERVICE.generateBillNo(orgId, orgCode, formCode, paramStr);
	}

	/**
	 * 生成编码
	 *
	 * @param formCode 表单编码
	 * @param paramStr 动态参数
	 */
	public static String genCode(String formCode, String paramStr) {
		return genCode(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), formCode, paramStr);
	}

	/**
	 * 生成多个编码
	 *
	 * @param orgId    组织ID
	 * @param orgCode  组织编码
	 * @param formCode 表单编码
	 * @param paramStr 动态参数
	 * @param genSize  生成数量
	 */
	public static List<String> genCodes(long orgId, String orgCode, String formCode, String paramStr, int genSize) {
		return BILL_NO_PATTERN_SERVICE.generateBillNos(orgId, orgCode, formCode, paramStr, genSize);
	}

	/**
	 * 生成多个编码
	 *
	 * @param formCode 表单编码
	 * @param paramStr 动态参数
	 * @param genSize  生成数量
	 */
	public static List<String> genCodes(String formCode, String paramStr, int genSize) {
		return genCodes(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), formCode, paramStr, genSize);
	}

	// ----------------------------------------------------------------
	// 生成条码
	// ----------------------------------------------------------------

	/**
	 * 生成条码
	 *
	 * @param orgId           组织ID
	 * @param orgCode         组织编码
	 * @param barcodeTypeEnum 条码类型
	 */
	public static String genBarcode(long orgId, String orgCode, BarcodeTypeEnum barcodeTypeEnum) {
		return BILL_NO_PATTERN_SERVICE.generateBarcode(orgId, orgCode, barcodeTypeEnum, null);
	}

	/**
	 * 生成条码
	 *
	 * @param barcodeTypeEnum 条码类型
	 */
	public static String genBarcode(BarcodeTypeEnum barcodeTypeEnum) {
		return genBarcode(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), barcodeTypeEnum);
	}

	/**
	 * 生成多个条码
	 *
	 * @param orgId           组织ID
	 * @param orgCode         组织编码
	 * @param barcodeTypeEnum 条码类型
	 * @param genSize         生成条码数
	 */
	public static List<String> genBarcodes(long orgId, String orgCode, BarcodeTypeEnum barcodeTypeEnum, int genSize) {
		return BILL_NO_PATTERN_SERVICE.generateBarcodes(orgId, orgCode, barcodeTypeEnum, null, genSize);
	}

	/**
	 * 生成多个条码
	 *
	 * @param barcodeTypeEnum 条码类型
	 * @param genSize         生成条码数
	 */
	public static List<String> genBarcodes(BarcodeTypeEnum barcodeTypeEnum, int genSize) {
		return genBarcodes(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), barcodeTypeEnum, genSize);
	}

	/**
	 * 生成条码
	 *
	 * @param orgId           组织ID
	 * @param orgCode         组织编码
	 * @param barcodeTypeEnum 条码类型
	 * @param paramStr        动态参数，需要在编码规则中，定义"参数传入”的细项
	 */
	public static String genBarcode(long orgId, String orgCode, BarcodeTypeEnum barcodeTypeEnum, String paramStr) {
		return BILL_NO_PATTERN_SERVICE.generateBarcode(orgId, orgCode, barcodeTypeEnum, paramStr);
	}

	/**
	 * 生成条码
	 *
	 * @param barcodeTypeEnum 条码类型
	 * @param paramStr        动态参数，需要在编码规则中，定义"参数传入”的细项
	 */
	public static String genBarcode(BarcodeTypeEnum barcodeTypeEnum, String paramStr) {
		return genBarcode(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), barcodeTypeEnum, paramStr);
	}

	/**
	 * 生成多个条码
	 *
	 * @param orgId           组织ID
	 * @param orgCode         组织编码
	 * @param barcodeTypeEnum 条码类型
	 * @param paramStr        动态参数，需要在编码规则中，定义"参数传入”的细项
	 * @param genSize         生成条码数
	 */
	public static List<String> genBarcodes(long orgId, String orgCode, BarcodeTypeEnum barcodeTypeEnum, String paramStr, int genSize) {
		return BILL_NO_PATTERN_SERVICE.generateBarcodes(orgId, orgCode, barcodeTypeEnum, paramStr, genSize);
	}

	/**
	 * 生成多个条码
	 *
	 * @param barcodeTypeEnum 条码类型
	 * @param paramStr        动态参数，需要在编码规则中，定义"参数传入”的细项
	 * @param genSize         生成条码数
	 */
	public static List<String> genBarcodes(BarcodeTypeEnum barcodeTypeEnum, String paramStr, int genSize) {
		return genBarcodes(OrgUtil.getOrgId(), OrgUtil.getOrgCode(), barcodeTypeEnum, paramStr, genSize);
	}

}
